package demo5;

/**
 * 修改第一次写的懒汉模式,加了一个锁
 */
public class SingletonLazy02 {
    //一开始不初始化，等到使用到的时候在初始化
    private static volatile SingletonLazy02 instance = null;

    //构造方法私有化
    private SingletonLazy02() {
    }

    //对外提供一个静态方法获取对象

    /**
     * 这么写有个问题就是后面来的线程其实判断为空没必要去获取
     * 锁资源，他们是可以并行判断，此时instance已经不为空了，
     * synchronized是防止突破了第一次检查的线程，保证，只有第一个线程能够被初始化，然后突破了
     * 第一曾的线程，第二个·线程开始以后都判断一下不为空就释放锁了
     * 而第一层的判断是给更后面来的线程，此时instance已经被创建好了没必要去拿锁，判断
     * 直接判断一下就可以走了，支持并行执行，可以节省cpu资源
     * @return
     */
    public static SingletonLazy02 getInstance() {
        synchronized (SingletonLazy02.class) {
            if (instance == null) {
                instance = new SingletonLazy02();
            }
        }
        return instance;
    }
}
